# include "grupo.h"

using namespace std;

void
Grupo::anyadirElemento(Figura* m)
{
	if (elementos.empty())
	{
		caja.setSi(m->supIzq());
		
		caja.setId(m->infDer());
	}
	
	else
	{
		Punto si = m->supIzq();
		
		Punto id = m->infDer();
		
		if (si.getX() < caja.getSi().getX())
		{
			caja.setIzq (si.getX());
		}
		
		if (si.getY() > caja.getSi().getY())
		{
			caja.setSup (si.getY());
		}
		
		if (id.getX() > caja.getId().getX())
		{
			caja.setDer (id.getX());
		}
		
		if (id.getY() < caja.getId().getY())
		{
			caja.setInf (id.getY());
		} 
	}
	
	elementos.push_back(m);
}

bool
Grupo::retirarElemento(Figura* m)
{
	bool borrado = false;
	
	for (list<Figura*>::iterator i = elementos.begin(); !borrado && i != elementos.end(); i++)
	{
		if (*i == m)
		{
			elementos.erase(i);
			
			borrado = true;
		}
	}	
	
	if (borrado)
	{
		calcularCaja();
	}
	
	return (borrado);
}

string
Grupo::Texto(int tab)
{
	string ret = "";
	
	for (int i = 0; i < tab; i++) ret += '\t';
	
	ret += "Grupo:\n";
	
	for (list<Figura*>::iterator i = elementos.begin(); i != elementos.end(); i++)
	{
		ret += (*i)->Texto(tab+1) + "\n";
	}		
	
	for (int i = 0; i < tab; i++) 
	{
		ret += '\t';
	}
		
	ret += "FinGrupo";
	
	return (ret);
}

void 
Grupo::setCR (int nR)
{
	for (list<Figura*>::iterator i = elementos.begin(); i != elementos.end(); i++)
	{
		(*i)->setCR(nR);
	}	
}

void 
Grupo::setCG (int nG)
{
	for (list<Figura*>::iterator i = elementos.begin(); i != elementos.end(); i++)
	{
		(*i)->setCG(nG);
	}	
}

void 
Grupo::setCB (int nB)
{
	for (list<Figura*>::iterator i = elementos.begin(); i != elementos.end(); i++)
	{
		(*i)->setCB(nB);
	}	
}

bool
Grupo::seleccionar (float x, float y)
{
	bool ret = false;
	
	for (list<Figura*>::iterator i = elementos.begin(); !ret && i != elementos.end(); i++)
	{
		if ((*i)->seleccionar(x,y))
		{
			ret = true;
		}
	}
	
	return (ret);
}

bool
Grupo::contenida(Punto a, Punto b)
{
	Punto si = caja.supIzq();
	
	Punto id = caja.infDer();
	
	return ((si.getX() >= a.getX()) && (id.getX() <= b.getX()) && (si.getY() <= a.getY()) && (id.getY() >= b.getY()));
}

void 
Grupo::redimensionar(float x, float y)
{	
	for (list<Figura*>::iterator i = elementos.begin(); i != elementos.end(); i++)
	{
		if (dynamic_cast<Rectangulo*> (*i))
		{
			((Rectangulo*)(*i))->redimensionar2(x, y);
		}
		
		else
		{
			(*i)->redimensionar(x , y);
		}
	}
	
	calcularCaja();
}
		
void 
Grupo::trasladar(float x, float y)
{
	caja.trasladar(x, y);
	
	for (list<Figura*>::iterator i = elementos.begin(); i != elementos.end(); i++)
	{
		(*i)->trasladar(x, y);
	}
}

Grupo*
Grupo::clonar ()
{
	Grupo* ret = new Grupo();
	
	for (list<Figura*>::iterator i = elementos.begin(); i != elementos.end(); i++)
	{
		ret->anyadirElemento((*i)->clonar());
	}
	
	return ret;
}

void
Grupo::calcularCaja()
{
	if (!elementos.empty())
	{
		Figura *aux = *elementos.begin();
		
		caja.setSi(aux->supIzq());
		
		caja.setId(aux->infDer());
		
		for (list<Figura*>::iterator i = elementos.begin(); i != elementos.end(); i++)
		{
			if ((*i)->supIzq().getX() < caja.getSi().getX())
			{
				caja.setIzq ((*i)->supIzq().getX());
			}
			
			if ((*i)->supIzq().getY() > caja.getSi().getY())
			{
				caja.setSup ((*i)->supIzq().getY());
			}
			
			if ((*i)->infDer().getX() > caja.getId().getX())
			{
				caja.setDer ((*i)->infDer().getX());
			}
			
			if ((*i)->infDer().getY() < caja.getId().getY())
			{
				caja.setInf ((*i)->infDer().getY());
			} 				
		}	
	}			
}
